#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

// 已知
long long l, r;
// 未知
long long dp[10][18]; // 首位是i,位数是j的蛇形数的个数
long long cnt = 0;
/*
10                                      1
20 21                                   2
30 31 32                                3
40 41 42 43
50 51 52 53 54
60 61 62 63 64 65
70 71 72 73 74 75 76
80 81 82 83 84 85 86 87
90 91 92 93 94 95 96 97 98
100
200 201 210 211
300 301 302 310 311 312 320 321 322
400 401 402 403 410 411 412 413 420 421 422 423 430 431 432 433



最后找200到210之间的

*/

void init()
{
    for (int i = 1; i <= 9; i++)
    {
        dp[i][1] = 1;
    }
    for (int i = 1; i <= 9; i++)
    {
        for (int j = 2; j <= 17; j++)
        {
            dp[i][j] = pow(i, j - 1);
        }
    }
}

long long cal(long long x)
{
    string sx = to_string(x);
    int n = sx.size();
    reverse(sx.begin(), sx.end());
    sx = ' ' + sx;
    long long res = 0;
    // 从1位到n-1位构造
    for (int i = n - 1; i >= 1; --i)
    {
        for (int j = sx[i] - '1'; j >= 0; j--)
        {
            if (j >= sx[n] - '0')
                continue;
            res += pow(sx[n] - '0', i - 1);
        }
        if (sx[i] >= sx[n])
            break;
    }
    // 比首位小的都可以
    for (int i = sx[n] - '1'; i > 0; --i)
    {
        res += pow(i, n - 1); // 首位是i,位数是n的蛇形数的个数
    }
    // 少一位的全加和
    for (int i = 9; i > 0; --i)
    {
        for (int j = n - 2; j >= 0; --j)
        {
            res += pow(i, j);
        }
    }
    int tag = 1;
    for (int i = 1; i < n; ++i)
    {
        if (sx[i] >= sx[0])
        {
            tag = 0; // 后面的数不能大于等于首位
        }
    }
    res += tag;
    return res;
}

int main()
{
    cin >> l >> r;
    init();
    cout << cal(r) - cal(l - 1) << endl;
    return 0;
}